package com.lsh.oms.core.dao.order;

import com.lsh.oms.core.dao.BaseDao;
import com.lsh.oms.core.dao.MyBatisRepository;
import com.lsh.oms.core.model.order.OrderHead;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @author huangdong
 * @date 16/8/1
 */
@MyBatisRepository
public interface OrderHeadDao extends BaseDao<OrderHead, Long> {

    /**
     * 查询订单号(大于$orderCode)
     *
     * @param orderCode
     * @return
     */
    Set<Long> findOrderCodesAfter(Long orderCode);

    /**
     * 根据地域和订单状态查询订单信息
     *
     * @param regionCode
     * @param orderStatus
     * @param excludeOrderCodes
     * @param timeOffset
     * @param fetchSize
     * @return
     */
    List<OrderHead> findListByRegionAndStatus(@Param("regionCode") Integer regionCode, @Param("orderStatus") Integer orderStatus,
                                              @Param("excludeOrderCodes") Set<Long> excludeOrderCodes, @Param("timeOffset") int timeOffset,
                                              @Param("fetchSize") int fetchSize, @Param("saleAreaLock") String saleAreaLock,
                                              @Param("storageType") Integer storageType,@Param("supplierGroupId") String supplierGroupId);

    /**
     * 根据地址获取用户单号列表(按下单时间排序)
     *
     * @param addressCode
     * @param limit
     * @return
     */
    List<Long> findOrderCodesByAddressCode(@Param("addressCode") Long addressCode, @Param("limit") int limit);

    /**
     * 根据订单状态返回查询订单列表(id, order_code, order_status, order_time, create_time, update_time)
     *
     * @param start
     * @param end
     * @return
     */
    List<OrderHead> findListByStatusRange(@Param("start") int start, @Param("end") int end, @Param("preTime") int preTime);

    List<OrderHead> findListByStatusRange2(@Param("start") int start, @Param("end") int end, @Param("preTime") int preTime, @Param("endTime") int endTime);


    /**
     * 统计客户地址下单数
     *
     * @param addressCode
     * @param startTime
     * @return
     */
    int countByAddressCode(@Param("addressCode") Long addressCode, @Param("startTime") int startTime);

    /**
     * 根据地址ID及订单状态区间查询订单
     *
     * @param addressCode
     * @param start
     * @param end
     * @return
     */
    List<OrderHead> findListByAddressCodeAndStatusRange(@Param("addressCode") Long addressCode, @Param("start") int start, @Param("end") int end);

    /**
     * 根据地址ID及订单状态区间及时间区间查询订单
     *
     * @param addressCode
     * @param start       订单状态开始
     * @param end         订单状态结束
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @return
     */
    List<OrderHead> findListByAddressCodeAndStatusRangeAndTimeRange(@Param("addressCode") Long addressCode, @Param("start") int start, @Param("end") int end, @Param("startTime") int startTime, @Param("endTime") int endTime);

    List<OrderHead> findListByStatusRangeAndTimeRange(@Param("start") int start, @Param("end") int end, @Param("startTime") int startTime);

    /**
     * 根据订单号,查询orderHead(集合的形式)
     *
     * @param orderCodes
     * @return
     */
    List<OrderHead> findListByOrderCodes(List<Long> orderCodes);

    /**
     * 批量插入数据库
     *
     * @param orderHeads
     */
    void insertBatch(List<OrderHead> orderHeads);

    /**
     * 根据区域、支付状态、订单状态, 查询订单
     *
     * @param regionCode
     * @param orderStatus
     * @param timeOffset
     * @param fetchSize
     * @param payStatus
     * @return
     */
    List<OrderHead> findListByRegionAndStatusAndPayStatus(@Param("regionCode") Integer regionCode, @Param("orderStatus") Integer orderStatus, @Param("payTypes") Set<Integer> payTypes, @Param("payStatus") Integer payStatus, @Param("time") int timeOffset, @Param("fetchSize") int fetchSize);

    /**
     * 根据区域、支付状态、订单状态, 查询订单
     *
     * @param uid
     * @param fetchSize
     * @return
     */
    List<OrderHead> findListByUid(@Param("uid") Long uid, @Param("fetchSize") int fetchSize);
}
